/** @format */
// 对 axios 做二次封装

// 导入 axios
import axios from 'axios'

// 导入 useUserStore 函数
import { useUserStore } from '@/stores/user'
import { ElMessage } from 'element-plus'
import router from '@/router'
// 创建 axios 实例
const instance = axios.create({
	// 基础地址
	baseURL: 'http://localhost:4000/api',
	// 请求超时时间
	timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(
	(config) => {
		// config: 包含了所有请求信息的对象，比如：method/url/headers...
		// 对请求做公共处理
		const userStore = useUserStore()
		// 获取 token
		const { token } = userStore

		// token 有值
		if (token) {
			// 在请求头中统一携带 token
			config.headers.Authorization = `Bearer ${token}`
		}
		// 给服务器返回请求对象
		return config
	},
	(error) => {
		// 请求失败的错误处理
		return Promise.reject(error)
	}
)

// 自定义响应状态码映射对象
const RESPONSE_CODE = {
	success: 10000, // 成功
	unauthorized: 401 // token过期
}

// 响应拦截器
instance.interceptors.response.use(
	(response) => {
		// 对响应成功做公共处理，响应状态码以2开头

		// 解构出 data
		const { data: resp } = response
		// 解构出 code，data，message
		const { code, data, message } = resp
		// 响应成功
		if (code === RESPONSE_CODE.success) {
			// 直接返回纯粹的数据
			return data
		}
		// 失败
		// 返回失败态的Promise实例，并携带错误信息
		return Promise.reject(new Error(message))
	},
	(error) => {
		// 解构出 status 和 message
		const {
			status,
			data: { message }
		} = error.response

		// 给出登录过期的提示
		ElMessage.error(message)

		if (status === RESPONSE_CODE.unauthorized) {
			// token过期
			const userStore = useUserStore()
			// 清除token和用户信息
			userStore.logout()
			// 跳转至登录，并携带回调的路由路径
			router.push(`/login?redirectUrl=${router.currentRoute.value.path}`)
		}

		// 返回一个失败态的 Promise 实例，并带上 error 错误信息
		return Promise.reject(error)
	}
)

// 默认导出 请求实例
export default instance
